package com.mazaiting.generator.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.mazaiting.common.core.domain.result.Option;
import com.mazaiting.common.core.ex.exceptions.BusinessException;
import com.mazaiting.common.core.ex.exceptions.EmptyObjectException;
import com.mazaiting.generator.config.GenDataSource;
import com.mazaiting.generator.domain.entity.DatasourceEntity;
import com.mazaiting.generator.domain.form.DatasourceForm;
import com.mazaiting.generator.domain.query.DatasourceQuery;
import com.mazaiting.generator.domain.vo.DatasourceVO;
import com.mazaiting.mybatisplus.domain.vo.BasePageVO;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 数据源管理
 */
public interface IDatasourceService extends IService<DatasourceEntity> {

    /**
     * 分页数据
     * @param datasourceQuery 查询对象
     * @return 分页查询数据
     */
    BasePageVO<DatasourceVO> page(DatasourceQuery datasourceQuery);

    /**
     * 新增数据
     * @param datasourceForm 表单数据
     * @return true: 新增成功; false: 新增失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean save(DatasourceForm datasourceForm) throws BusinessException;

    /**
     * 更新数据
     * @param datasourceForm 表单数据
     * @return true: 更新成功; false: 更新失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean update(DatasourceForm datasourceForm) throws EmptyObjectException;

    /**
     * 删除数据
     * @param ids ID 列表
     * @return true: 删除成功; false: 删除失败
     */
    @Transactional(rollbackFor = Exception.class)
    boolean deleteByIds(String ids);

    /**
     * 根据 ID 获取信息
     * @param id ID
     * @return 信息
     */
    DatasourceVO getInfoById(Long id);

    /**
     * 根据数据源 ID 查询生成数据源信息
     *
     * @param id 数据源 ID
     * @return 生成数据源信息
     */
    GenDataSource getBySourceId(Long id) throws Exception;

    /**
     * 获取数据库产品名，如：MySQL
     *
     * @param datasourceId 数据源ID
     * @return 返回产品名
     */
    String getDatabaseProductName(Long datasourceId);

    /**
     * 数据源下拉列表
     * @return 数据源下拉列表
     */
    List<Option<Long>> listOptions() throws BusinessException;


}